package completablefuture;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class FutureTaskDemo {
    /*
    其中，CompletionStage 接口和 CompletableFuture 类是在Java 8中同时新增的，而 Future 接口则是在Java 5中产生的。
    因此，我们可以认为 CompletableFuture 是 Future 及其实现类 FutureTask 的增强版本。
    可以看到，Future 和 FutureTask 的功能比较单一，只支持 get() 和 isDone() 方法，
    一旦业务场景稍微复杂一些，则需要在此基础上写很多业务代码才能支持。
    而CompletableFutrue的出现，则正是为了解决这个问题。
    * */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        long startTime = System.currentTimeMillis();
        FutureTask<String> futureTask1 = new FutureTask<>(() -> {
            Thread.sleep(2000);
            return "futureTask1 执行完成";
        });
        new Thread(futureTask1).start();

        FutureTask<String> futureTask2 = new FutureTask<>(() -> {
            Thread.sleep(2100);
            return "futureTask2 执行完成";
        });
        new Thread(futureTask2).start();

        while (true){
            // isDone() 方法的作用是，判断任务是否执行完毕，通常在程序中轮询使用
            if (futureTask1.isDone() && futureTask2.isDone()){
                // get() 方法的作用是，以阻塞的方式，获取任务执行结果
                System.out.println(futureTask1.get());
                System.out.println(futureTask2.get());
                break;
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("耗时: " + (endTime-startTime));
    }
}
